如果你的系統只是個學生專題,那 AI 幫你寫的 CRUD 確實很堪用。但在真實產品上,AI 寫出來的資料庫操作簡直可能會變成未爆彈。AI 最喜歡做的事,就是呼叫一連串的 db.insert() 或是 db.update(),卻完全不幫你包在一個 Transaction(交易)裡面。一旦執行到一半網路抖一下,或者某個欄位 Validation 沒過,你的資料庫裡就會留下一堆失去關聯的孤兒資料(Orphan Data)。
前陣子,有個 vibe coder 用 ChatGPT 寫了電商的結帳邏輯。AI 給出的 Code 看起來條理分明:
先把使用者的錢包餘額扣掉>再把庫存數量減一>最後建立一張訂單紀錄。
vibe coder 看了一眼覺得邏輯滿分,直接推上線。結果某天晚上,資料庫的連線池(Connection Pool)剛好滿了。系統在執行完第一步跟第二步之後,要執行第三步建立訂單時,噴出了 TimeoutError。
因為這三步操作沒有被包在同一個資料庫 Transaction 裡,使用者的錢被扣了,庫存也被扣了,但訂單根本沒建立出來。
面對 AI 產生的這種髒 code ,我們必須想辦法攔截
靜態分析:強制要求 Transaction 裝飾器或 Context Manager
我們不能依賴人眼去檢查有沒有漏寫 Rollback。直接在 Linter 的層級,制定規範。以 Python 的 SQLAlchemy 為例,我們要求只要是有寫入(Insert/Update/Delete)操作的 Service Function,就必須有 @transactional 的裝飾器,或是明確使用 with session.begin():。
整合測試:
在 CI 的 E2E 測試中,應該故意在連續資料庫寫入的過程中,注入一個 Exception(Fault Injection)。然後去斷言(Assert)資料庫的狀態必須 100% 回滾到操作前的狀態。只要查到任何一筆多出來的髒資料,CI 直接亮紅燈。